/**
   @file sys_usw_emsg.h

   @date 2020-09-01

   @version v1.0

   The file defines Macro, stored data structure for EMSG module
 */
#ifndef _SYS_USW_EMSG_H_
#define _SYS_USW_EMSG_H_
#ifdef __cplusplus
extern "C" {
#endif

#include "sal.h"

/*

Request Packet Format:
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0                   1                   2                   3  |
|0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Type     | Flags |    UnitId     |     Length            |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              sequenceId                       |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               ~                               |
|                              DATA                             |
|                               ~                               |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Reply Packet Format:
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0                   1                   2                   3  |
|0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Type     | Flags |    UnitId     |     Length            |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              sequenceId                       |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              error_code                       |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               ~                               |
|                              DATA                             |
|                               ~                               |
|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


*/


#define EMSG_HDR_LEN sizeof(sys_emsg_hdr_t)
#define EMSG_END_TLV 0xFFFF

typedef struct sys_emsg_hdr_s
{
    uint32  type       : 8, /*sys_emsg_type_t*/
            /*Flags, 4bit*/
            ack      : 1,  /* 0: Request; 1: Reply */
            sync     : 1,  /* 0: Async; 1: Sync */
            rsv      : 2,  /* Reserved*/

            uintId   : 8,
            len      : 12;/*total length, units: 4B*/
    uint32  seqId;
}sys_emsg_hdr_t;


typedef struct sys_emsg_tlv_s
{
    uint16 type;/* endTlv = 0xFFFF*/
    uint16 length;
    char   val[0];
}sys_emsg_tlv_t;

typedef enum sys_emsg_type_e
{
    SYS_EMSG_TYPE_SSX,
    SYS_EMSG_TYPE_FTE,
    SYS_EMSG_TYPE_PTP,
    SYS_EMSG_TYPE_OAM,
    SYS_EMSG_TYPE_LA, /*learning & aging*/
    SYS_EMSG_TYPE_MAX
}sys_emsg_type_t;

typedef enum sys_emsg_error_code_e
{
    SYS_EMSG_E_NONE = 0,
    SYS_EMSG_E_NOT_HANDLED = 1,

}sys_emsg_error_code_t;


typedef int32 (* sys_emsg_rx_cb)(uint8 lchip, uint8* msg);


extern int32
sys_emsg_buf_alloc(uint8 lchip, uint8 type, uint8 ack, uint8 sync, uint16* buf_id, uint8** buf);
extern int32
sys_emsg_buf_free(uint8 lchip, uint16 buf_id);
extern int32
sys_emsg_reply(uint8 lchip, uint8* buf, uint16 len);
extern int32
sys_emsg_request(uint8 lchip, uint8* buf, uint16 len, uint8** r_buf);
extern int32
sys_emsg_rx_register(uint8 lchip, sys_emsg_type_t type, sys_emsg_rx_cb cb);
extern int32
sys_emsg_init(uint8 lchip);
extern int32
sys_emsg_deinit(uint8 lchip);

#endif

